package net.oschina.aibinxiao.scheduler;

import net.oschina.aibinxiao.job.HelloJob4;
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @Author: AiBinXiao
 * @Description: CronTrigger第2个案例，灵活使用Cron表达式
 * @Date: 2017/10/12 9:48
 */

public class CronTriggerScheduler2 {
    public static void main(String[] args) throws SchedulerException {
        // 打印当前时间，格式为 yyyy-MM-dd HH:mm:ss
        Date date = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String dateStr = sdf.format(date);
        System.out.println("当前时间是：" + dateStr);

        // 创建一个JobDetail实例，将该实例与HelloJob Class绑定  传入自定义参数
        JobDetail jobDetail = JobBuilder.newJob(HelloJob4.class)
                .withIdentity("myjob2")
                .build();

        // 创建一个CronTrigger实例，每1秒触发一次任务
        CronTrigger cronTrigger = (CronTrigger) TriggerBuilder
                .newTrigger()
                .withIdentity("mytrigger2", "group2")
                .withSchedule(
                        CronScheduleBuilder
                                .cronSchedule("0/5 * 10,18 * * ?") // Cron表达式 *号按照顺序依次是
                )                             // [秒] [分] [小时] [日] [月] [周] [年]，*表是每
                .build();
        // 通过执行结果可以得知 endAt是优先于withRepeatCount的，endAt会覆盖withRepeatCount的效果

        // 符号解释
        // ,表示或，可以指定多个值  *表示每  ?表示不指定值，即不关心  / 表示每隔多久执行一次(比如在在[分]位置的 0/5 表示每隔五分钟执行一次)
        // -表示时间间隔，即什么时候到什么时候(比如在在[年]位置的 2016-2017 表示只在2016-2017年见执行)
        // # [周]位置特殊符号(比如 6#3 表示第三周的周五 6表示周五，3表示第三周) ，周几还可以用英文单词的前三个字母表示(不区分大小写)，比如MON-FRI

        // 案例
        // (1) 2017年内每天的上午10点32分触发
        // 0 32 10 ? * * 2017
        // (2) 每天的14点整到14点59分55秒，以及18点整到18点59分55秒，每隔5秒执行一次
        // 0/5 * 14,18 * * ?
        // (3) 每月的周一到周五的10点45分触发
        // 0 45 10 ? * MON-FRI
        // (4) 每月的最后一天的10点45分触发
        // 0 45 10 L * *
        // (5) 每月的第三周的周五的10点45分触发
        // 0 45 10 ? * 6#3

        // 创建Scheduler实例
        SchedulerFactory sfact = new StdSchedulerFactory();
        Scheduler scheduler = sfact.getScheduler();
        scheduler.start();
        scheduler.scheduleJob(jobDetail, cronTrigger);
    }
}
